package facades;

import java.util.*;
import java.beans.Beans;
import java.lang.reflect.InvocationTargetException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.PageContext;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils; 
import org.apache.commons.beanutils.locale.LocaleBeanUtils;
import org.apache.commons.beanutils.locale.LocaleConvertUtils;
import org.apache.commons.beanutils.locale.LocaleConverter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.commons.beanutils.locale.converters.DoubleLocaleConverter;
import org.apache.commons.beanutils.locale.converters.StringLocaleConverter;

import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;

import auser.AccantonamentoBar;
import auser.Circolo;
import auser.Counters;
import auser.Db4oCareTaker;
import auser.ParametersPDoppia;
import auser.PianoDeiConti;
import auser.ScritturaDiPrimaNota;
import auser.Socio;
import auser.Tessera;
import auser.Utente;
import auser.VoceDiPrimaNota;
import auser.VoceDiPrimaNotaDaScrittura;

import com.db4o.Db4oUtil;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.ext.ExtObjectContainer;
import com.db4o.query.Constraint;
import com.db4o.query.Query;
import com.db4o.servlet.Db4oServlet;
import com.spaceprogram.db4o.sql.Sql4o;
import com.spaceprogram.db4o.sql.Sql4oException;
import com.spaceprogram.db4o.sql.parser.SqlParseException;

import converters.DateLocaleConverterCustom;
import converters.DoubleLocalConverterCustom;

public class SessionFacade {
	private HttpSession session=null; 
	private ExtObjectContainer container = null; 
	private Db4oCareTaker db4oct = null;
	
	public HttpSession getSession() {
		return session;
	}
	
	public final static SessionFacade getInstance(HttpServletRequest request) {
		SessionFacade s = (SessionFacade) request.getSession().getAttribute("sfacade");
		if(s==null) s = new SessionFacade(request.getSession());
		
		request.getSession().setAttribute("sfacade",s);
		return s;
	}
	public void setBean(Object bean,Map properties){
		try {
			
			LocaleBeanUtils.populate(bean,properties);
			
			
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		
	}
	
	 
	public void setSessionBean(String beanName,Map properties){
		setBean(session.getAttribute(beanName),properties);
	}
	
	public void setProperty(String beanName,String property,Object value){
		try {
			LocaleBeanUtils.setProperty(session.getAttribute(beanName),property,value);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} 
	}
	
	public Object getFirst(Object object){
		return db4oct.getFirst(object);
	}
	
	public void setSession(HttpSession session) {
		this.session = session;
		Utente u = (Utente) session.getAttribute("userBean");		
		
		if(u==null){
		 
			  
		}else {
			container = (ExtObjectContainer)Db4oServlet.sharedTransaction(
					session.getServletContext(),
					session,
					u.getCircolo().getGruppo()
				);
		}
		 
		
	}
	
	public SessionFacade(HttpSession session){
		setSession(session);
		db4oct = new Db4oCareTaker(container);
	}
	
	public static boolean getLogin(HttpServletRequest request){
		boolean isaut = false; 
		Db4oCareTaker db4oct = new Db4oCareTaker(request.getSession(),request.getParameter("gruppo")); 
		com.db4o.ObjectContainer co = db4oct.getContainer();
		List users ;
		 
		com.db4o.query.Query qu = co.query();
		qu.constrain(Utente.class);
		qu.descend("userId").constrain(request.getParameter("j_username")).like(); 
		qu.descend("password").constrain(request.getParameter("j_password")).like(); 
		
		users = qu.execute();
		if(users.size()>0){
			Utente u = (Utente) users.get(0);
			request.getSession().setAttribute("userBean",u);
			request.getSession().setAttribute("userid",u.getUserId());
			request.getSession().setAttribute("circolo",u.getCircolo());
		}
		return (users.size()>0);
	}
	
	public ExtObjectContainer getContainer(){
		return container;
	}

	public long getID(Object obj){
		return db4oct.getID(obj);
	}
	
	public long getID(String name,PageContext context){
		return db4oct.getID(context.getAttribute(name));
	}
	
	public long getID(String name,HttpSession context){
		return db4oct.getID(context.getAttribute(name));
	}
	
	public Object getById(long id){
		return db4oct.getById(id);
	}
	
	public Object getById(String id){
		return db4oct.getById(new Long(id));
	}
	
	public Query newQuery(Class clazz){
		return db4oct.newQuery(clazz);
		
	}
	
	public ObjectSet get(Object object){
		return db4oct.get(object);
	}
	
	public ObjectSet getByMap(Map map,Object emptyPrototype){
		return db4oct.getByMap(map,emptyPrototype);
	}
	
	public boolean objectIsCopy(Map values,Object emptyPrototype,Object original){ 
		return db4oct.objectIsCopy(values,emptyPrototype,original);
	}
	
	public boolean objectIsCopy(Object prototype,Object original){
		return db4oct.objectIsCopy(prototype,original);
	}
	
	public void set(Object object){ 
		db4oct.set(object);
	}
	
	public void setFromSession(String name,boolean remove){ 
		if(session.getAttribute(name)==null) return;
		db4oct.set(session.getAttribute(name));
		if(remove) session.removeAttribute(name);
	}
	
	public void set(Object object,int i){
		db4oct.set(object,i);
	}

	public Db4oCareTaker getDb4oct() {
		return db4oct;
	}
	
	public Utente getUtenteCorrente(){
		return (Utente)session.getAttribute("userBean");
	}
	
	public void saveAccantonamentoBarFromSession(String accantonamentoBarSessionName){
		AccantonamentoBar a = (AccantonamentoBar) session.getAttribute(accantonamentoBarSessionName);
		if(a==null)return;
		saveAccantonamentoBar(a);
	}
	
	public List<Circolo>getCircoli(){
		Query q = this.newQuery(Circolo.class);
		q.descend("descrizione").orderAscending();
		return q.execute();
	}
	
	public PianoDeiConti loadVocePianoDeiContiByCodice(String codice){
		PianoDeiConti p = null;
		Query q=null;
		int livello = 0;
		
		if(codice.endsWith(".0")) livello=3;
		else livello=4;
		
		try{
			q = container.query();	
			q.constrain(PianoDeiConti.class);
			q.descend("codice").constrain(codice).startsWith(true);
			if(livello==4) q.descend("circolo").constrain(getUtenteCorrente().getCircolo()) ;
			 
			p=(PianoDeiConti)q.execute().next();
			//System.out.println("-- caricato " + p + " " + p.getCodice() + " da codice " + codice +  " livello " + livello + " circolo " + p.getCircolo().getCodice());
			
		}catch(Exception e){
			System.err.println("-- errore nel caricare Codice " + codice);
			 
		}
		
		return p;
	}
	
	public List querySql(String sql){
		return db4oct.querySql(sql);
	}
	
	public List querySql(String className,String where,String orderBy,boolean hasCircolo){
		if(where!=null) where = " WHERE " + where;
		if(hasCircolo) {
			if(where==null) where=" WHERE ";
			else where+=" AND ";
			where+= "o.circolo.codice= '" + getUtenteCorrente().getCircolo().getCodice() +"'"	;
		}
		
		if(orderBy==null) orderBy="";
		else orderBy=" ORDER BY " + orderBy;
		
		String sql = 	" SELECT * FROM auser." + className + " o " +
						where +
						orderBy;
		System.out.println(sql);
		return db4oct.querySql(sql);
	}
	
	public List<Socio>getVolontari(){
		String sql = 	" from auser.Socio s where " +
						" where trasportoAmmalati=true " + 
						" and  s.circolo.codice = " + getUtenteCorrente().getCircolo().getCodice() +
						" order by cognome,nome " + 
						"" ;
		
		return querySql(sql);
	}
	public void saveAccantonamentoBar(AccantonamentoBar accantonamentoBar){
		Query q = null;
		ParametersPDoppia p = getParametersPdoppia();
		PianoDeiConti cassaBar=null;
		PianoDeiConti attivitaBar=null;
		
		try{
			q = db4oct.newQuery(PianoDeiConti.class);	
			q.descend("codice").constrain(p.getCodiceCassaBar()).startsWith(true);
			cassaBar=(PianoDeiConti)q.execute().next();
		}catch(Exception e){
			System.err.println("-- errore nel caricare Codice " + p.getCodiceCassaBar());
			return;
		}
		
		try{
			q = db4oct.newQuery(PianoDeiConti.class);	
			q.descend("codice").constrain(p.getCodiceAttivitaBar()).startsWith(true);
			attivitaBar=(PianoDeiConti)q.execute().next();
		}catch(Exception e){
			System.err.println("-- errore nel caricare Codice " + p.getCodiceAttivitaBar());
			return;
		}
		
		ScritturaDiPrimaNota editPdoppia = new ScritturaDiPrimaNota();
		editPdoppia.setDescrizione("Versamento Bar");
		
		editPdoppia.setDataScrittura(accantonamentoBar.getDataAccantonamento());
		editPdoppia.setAnnoCompetenza(accantonamentoBar.getAnnoCompetenza());
		editPdoppia.setCausale("");
		editPdoppia.setCircolo(getUtenteCorrente().getCircolo());
		editPdoppia.setProgressivoOperazione(  getNext(ScritturaDiPrimaNota.class,editPdoppia.getAnnoCompetenza())  );
		
		VoceDiPrimaNotaDaScrittura v = new VoceDiPrimaNotaDaScrittura();
			v.setCircolo(editPdoppia.getCircolo());
			v.setDescrizione("Versamento Bar");
			v.setVocePianoDeiConti(cassaBar);
			v.setImporto(accantonamentoBar.getImporto());
			v.setQuadro("d");
			v.setParent(editPdoppia);
			v.setRiga(1);
			v.setDataScrittura(editPdoppia.getDataScrittura());	
			editPdoppia.getVociQuadrod().add(v);
			
		v = new VoceDiPrimaNotaDaScrittura();
			v.setCircolo(editPdoppia.getCircolo());
			v.setDescrizione("Versamento Bar");
			v.setVocePianoDeiConti(attivitaBar);
			v.setImporto(accantonamentoBar.getImporto());
			v.setQuadro("a");
			v.setParent(editPdoppia);
			v.setRiga(1);
			v.setDataScrittura(editPdoppia.getDataScrittura());
			editPdoppia.getVociQuadroa().add(v);
		
		set(editPdoppia);
		getContainer().commit();	
			 
	}
	public void saveScritturaSociFromSession(String tesseraSessionName){
		Tessera t = (Tessera) session.getAttribute(tesseraSessionName);
		if(t==null)return;
		saveScritturaSoci(t);
	}
	public void saveScritturaSoci(Tessera tessera){
		if(tessera==null)return;
		
		ScritturaDiPrimaNota editPdoppia = new ScritturaDiPrimaNota();
		ParametersPDoppia pd = getParametersPdoppia();
		String descrizioneVoce = tessera.getSocio().getCognome() + " " + tessera.getSocio().getNome();
		VoceDiPrimaNotaDaScrittura voce; 
		Date today = new Date();
		
		editPdoppia.setAnnoCompetenza(pd.getAnnoContabile());
		editPdoppia.setCausale("economico_ricavi");
		editPdoppia.setCircolo(getUtenteCorrente().getCircolo());
		editPdoppia.setDataScrittura(today);
		editPdoppia.setDescrizione("Tessera " + pd.getAnnoContabile());
		editPdoppia.setProgressivoOperazione(  getNext(ScritturaDiPrimaNota.class,editPdoppia.getAnnoCompetenza())  );
		
		double quotaFA = tessera.getSottoscrizioneFiloArgento()==0?0:tessera.getSottoscrizioneFiloArgento();
		double quotaUp = tessera.getSottoscrizioneUniversitaAdulti()==0?0:tessera.getSottoscrizioneUniversitaAdulti();
		double quotaAu = tessera.getSottoscrizioneAuser()==0?0:tessera.getSottoscrizioneAuser();
		double quotaRip = tessera.getQuotaAssociativa()==0?0:tessera.getQuotaAssociativa();
		
		if(quotaFA+quotaUp+quotaAu+quotaRip==0){
			System.out.println("-- saveScritturaSoci : tessera non contabilizzata, Nessuna quaota specificata");
			return;
		}
		double quotaTesseraCircolo = 	quotaRip - 
										pd.getRipQuotaTesseraNaz()-
										pd.getRipQuotaTesseraProv()-
										pd.getRipQuotaTesseraProvFa() -
										pd.getRipQuotaTesseraReg();
		
		
		if(quotaTesseraCircolo>0){ 
			// p.setCodiceQuotaTesseraCircolo("80.AU.01.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(quotaTesseraCircolo); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(1); 
				voce.setVocePianoDeiConti(pd.getPcQuotaTesseraCircolo());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(pd.getRipQuotaTesseraNaz()>0){ 
			//p.setCodiceQuotaTesseraNaz("29.AU.02.0");	
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(pd.getRipQuotaTesseraNaz()); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(2); 
				voce.setVocePianoDeiConti(pd.getPcQuotaTesseraNaz());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(pd.getRipQuotaTesseraProv()>0){ 	
			// p.setCodiceQuotaTesseraProv("29.AU.04.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(pd.getRipQuotaTesseraProv()); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(3); 
				voce.setVocePianoDeiConti(pd.getPcQuotaTesseraProv());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(pd.getRipQuotaTesseraProvFa()>0){ 	
			//p.setCodiceQuotaTesseraProvFA("29.FA.04.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(pd.getRipQuotaTesseraProvFa()); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(4); 
				voce.setVocePianoDeiConti(pd.getPcQuotaTesseraProvFA());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(pd.getRipQuotaTesseraReg()>0){ 		
			// p.setCodiceQuotaTesseraReg("29.AU.03.0");	
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(pd.getRipQuotaTesseraReg()); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(5); 
				voce.setVocePianoDeiConti(pd.getPcQuotaTesseraReg());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(quotaAu>0){ 		
			//p.setCodiceQuotaAuser("81.AU.01.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(quotaAu); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(6); 
				voce.setVocePianoDeiConti(pd.getPcQuotaAuser());		
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(quotaFA>0){ 		
			//p.setCodiceQuotaFA("81.FA.01.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(quotaFA); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(7); 
				voce.setVocePianoDeiConti(pd.getPcQuotaFA());
				editPdoppia.getVociQuadroa().add(voce);
		}
		
		if(quotaUp>0){ 		
			//p.setCodiceQuotaUpel("81.UP.01.0");
			voce=new VoceDiPrimaNotaDaScrittura();  
				voce.setCircolo(getUtenteCorrente().getCircolo());
				voce.setDataScrittura(today);
				voce.setDescrizione(descrizioneVoce);
				voce.setImporto(quotaUp); 
				voce.setParent(editPdoppia); 
				voce.setQuadro("a");
				voce.setRiga(8); 
				voce.setVocePianoDeiConti(pd.getPcQuotaUpel());
				editPdoppia.getVociQuadroa().add(voce);
		}
		  		
		//p.setCodiceCassa("01.AU.01.0");
		voce=new VoceDiPrimaNotaDaScrittura();  
			voce.setCircolo(getUtenteCorrente().getCircolo());
			voce.setDataScrittura(today);
			voce.setDescrizione(descrizioneVoce);
			voce.setImporto( quotaAu + quotaFA + quotaRip + quotaUp ); 
			voce.setParent(editPdoppia); 
			voce.setQuadro("d");
			voce.setRiga(9); 
			voce.setVocePianoDeiConti(pd.getPcCassa());
			editPdoppia.getVociQuadrod().add(voce);
		
		set(editPdoppia);
		getContainer().commit();
		
	}
	
	public void saveScritturaFromPdoppiaEdit(HttpServletRequest request,boolean remove) throws Exception{
		String curCode = null;
		String curType="";
		try {
			ScritturaDiPrimaNota editPdoppia = (ScritturaDiPrimaNota)request.getSession().getAttribute("editPdoppia");
			boolean isAdd = (getID(editPdoppia)==0);
			 
			if (isAdd){
				for (int i = 0; i < 8; i++) { 
					Map prop=new HashMap();
					Query q=null;
					VoceDiPrimaNotaDaScrittura voce=null;
					PianoDeiConti pc=null;
					String curKey = null; 
					String curId=null;
					
					for(int k=0;k<2;k++){
						if(k==0) 	{curKey="a"+i;curType="a";}
						else 		{curKey="d"+i;curType="d";}
						
						curCode = request.getParameter("cod_"+curKey);
						curId = request.getParameter("id_"+curKey);
						
						if(!(curId==null || curId.equals(""))){
							
							pc = (PianoDeiConti)getById(curId);
							
							prop.put("descrizione",request.getParameter("desc_"+curKey));
							prop.put("importo",request.getParameter("importo_"+curKey));
							
							voce = new VoceDiPrimaNotaDaScrittura();
							voce.setCircolo(getUtenteCorrente().getCircolo());
							voce.setVocePianoDeiConti(pc);
							voce.setParent(editPdoppia);
							voce.setRiga(i); 
							voce.setQuadro(curType);
							setBean(voce,prop);
							set(voce);
							
							if(curType.equals("a")){
								//System.out.println("adding a voce " +voce.getVocePianoDeiConti().getCodice() + " indice " + i);
								editPdoppia.getVociQuadroa().add(i,voce);
							}else{
								//System.out.println("adding a voce " +voce.getVocePianoDeiConti().getCodice() + " indice " + i);
								
								editPdoppia.getVociQuadrod().add(i,voce);
							}	
						}
						
						 
					}
					
					 
					
				}
			}
			
			setBean(editPdoppia,request.getParameterMap());
			
			if(editPdoppia.getProgressivoOperazione()==null || editPdoppia.getProgressivoOperazione()==0) 
				editPdoppia.setProgressivoOperazione(getNext(ScritturaDiPrimaNota.class,editPdoppia.getAnnoCompetenza()));
			
			set(editPdoppia);
			getContainer().commit();
			
			if(remove) session.removeAttribute("editPdoppia");
			
		} catch (IndexOutOfBoundsException iob) {
			iob.printStackTrace();
			throw new Exception("Errore in memorizzazione Prima Nota codice non trovato : " + curCode);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Errore in memorizzazione Prima Nota : " + e.getMessage());
		}
		
	}
	
	
	private static Counters firstValid(List<Counters>list){
		if(list.size()==0) return null;
		for (int i = 0; i < list.size(); i++) {
			if(list.get(i)!=null) return list.get(i); 
		}
		return null;
	}
	
	public long  getNext(Class clazz) {
		return getNext(this.getContainer(),clazz,getUtenteCorrente().getCircolo());
	}
	
	public long  getNext(Class clazz,int anno) {
		return getNext(getContainer(),clazz,anno,getUtenteCorrente().getCircolo());
	}
	public long  getNext(ObjectContainer db,Class clazz,Circolo circolo) {
		return getNext(db,clazz,0,circolo);
	}
	
	public long  getNext(ObjectContainer db,Class clazz,int anno,Circolo circolo) {
		Counters c = null;
		try {
			Query q = db.query();
			q.constrain(Counters.class);
			q.descend("className").constrain(clazz.getName()).like();
			q.descend("anno").constrain(anno);
			q.descend("circolo").constrain(circolo);
			
			c = firstValid(q.execute()); 
			c.setLastDate(new Date());
		} catch (Exception e) { 
			System.out.println("Error - Counter : " + e.getClass().getName() +  " " + e.getMessage());
		}
		 
		if(c==null) {
			c = new Counters(clazz); 
			c.setAnno(anno);
			c.setCircolo(circolo);
			c.setClassName(clazz.getName());
			c.setLastDate(new Date());
			
		}
		
		long no = c.getNext(); 
		 
		db.set(c);
		db.commit(); 
		
		
		return no;
	}
	
	public ParametersPDoppia getParametersPdoppia(){
		ParametersPDoppia p =null;  
		
		Query q=null; 
		boolean addInSession=false;
		
		if(p==null){
			addInSession=true;
			try{
				p=(ParametersPDoppia)getContainer().query(ParametersPDoppia.class).get(0)  ; 
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
		if(addInSession){
			session.setAttribute("ParametersPdoppia",p);
		}
		
		p.setContainer(this.container);
		p.setCircolo(getUtenteCorrente().getCircolo());
		p.syncronizeData();
		return p;
	}
	
	public void addConstraint(Constraint co,Query qu,String field,HttpServletRequest request){
		try {
			addConstraint(co,qu,request.getParameter(field),request);	
		} catch (Exception e) {
			//System.err.println("Error : " + e.getMessage());
		}
		
	}
	
	public void addConstraint(Constraint co,Query qu,String field,Object value,HttpServletRequest request){
		try {
			if(request.getParameter(field)!=null)
				if( !request.getParameter(field).equals(""))
					co.or(qu.descend(field).constrain(value).equal());	
		} catch (Exception e) {
			//System.err.println("Error : " + e.getMessage());
		}
		
	}
	
	public void addConstraint(Query qu,String field,Object value,HttpServletRequest request){
		try {
			if(request.getParameter(field)!=null)
				if( !request.getParameter(field).equals(""))
					qu.descend(field).constrain(value).equal();	
		} catch (Exception e) {
			//System.err.println("Error : " + e.getMessage());
		}
		
	}
	
	public void deleteScritturaDiPrimaNota(ScritturaDiPrimaNota scrittura){
		List<VoceDiPrimaNota>voci;
		
		voci=scrittura.getVociQuadroa();
		for (int i = 0; i < voci.size(); i++) {
			this.getContainer().delete(voci.get(i));
		}
		
		voci=scrittura.getVociQuadrod();
		for (int i = 0; i < voci.size(); i++) {
			this.getContainer().delete(voci.get(i));
		}
		this.getContainer().delete(scrittura);
		
		getContainer().commit();
	}
	
	public static void deleteScritturaDiPrimaNota(ScritturaDiPrimaNota scrittura,ObjectContainer container){
		List<VoceDiPrimaNota>voci;
		
		voci=scrittura.getVociQuadroa();
		for (int i = 0; i < voci.size(); i++) {
			container.delete(voci.get(i));
		}
		
		voci=scrittura.getVociQuadrod();
		for (int i = 0; i < voci.size(); i++) {
			container.delete(voci.get(i));
		}
		container.delete(scrittura);
		
		container.commit();
	}
	
	
}
